unit UFrmContador;

interface

uses
  Windows, WinSock, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, MMSystem, NMMSG, lzExpand, StdCtrls, ExtCtrls, registry, constantes,
  ScktComp, Psock, lmdmmS, lmdcompo, lmdclass;

type
  TFrmcontador = class(TForm)
    Shape1: TShape;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton2: TSpeedButton;
    Label4: TLabel;
    Panel1: TPanel;
    Timer1: TTimer;
    MsgServer: TNMMSGServ;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    MsgClient101: TNMMsg;
    Label3: TLabel;
    SpeedButton1: TSpeedButton;
    tempototal: TLabel;
    Label5: TLabel;
    LMDWaveComp1: TLMDWaveComp;
    LMDWaveComp2: TLMDWaveComp;
    LMDWaveComp3: TLMDWaveComp;
    Function GetStateK (Key: integer): boolean;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure MsgServerMSG(Sender: TComponent; const sFrom, sMsg: String);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SpeedButton2Click(Sender: TObject);
    procedure MsgClient101ConnectionFailed(Sender: TObject);
    Procedure enviarComando;
    procedure EnableTaskBar(bShow: Boolean);
    procedure ShowTaskBar(bShow: Boolean);
    procedure EscondeIniciar(Visible:Boolean);
    procedure OpcoesMenu(Visible:Boolean);
//    function WinExit(flags: integer): boolean;
    procedure ShutDown;
    function GetLocalIP : string;
    procedure travatask(trava : Boolean);
    procedure ALTAB;
    procedure travaALT;
    procedure liberaALT;
    procedure MinimizeAll;
    procedure SpeedButton1Click(Sender: TObject);
  private
  fecha: Boolean;
   { Private declarations }
  public
    { Public declarations }
  end;

var
  Frmcontador: TFrmcontador;
  comando : string;
  WindowsDir: string;
  i : TDateTime;
  k : TDateTime;
  j : Real;
  valor : real;
  id1: integer;
implementation
uses UFrmprotec, UFrmmsg, UFrmSenha;

{$R *.DFM}
const
RSP_SIMPLE_SERVICE=1;
RSP_UNREGISTER_SERVICE=0;
MOD_ALT = 1;

//procedimento para travar a lista de tarefas CTRL+ALT+DEL Win2k e WinXP
procedure TFrmContador.travatask(trava : Boolean);
var
   reg : TRegistry;
begin
   Reg := TRegistry.Create;
   try
      Reg.RootKey := HKEY_CURRENT_USER;
      Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', true);
      if Trava = true then
         Reg.WriteInteger('DisableTaskMgr',1)
      else
         Reg.WriteInteger('DisableTaskMgr',0);
   finally
     Reg.Free;
   end;
end;

//procedimento para fazer ALT+TAB para minimizar Counter-Striker
procedure TFrmContador.ALTAB;
begin
   SetForegroundWindow(Application.Handle);
{ Mantém pressionada ALT }
keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Pressiona TAB }
keybd_event(VK_TAB, 0, 0, 0);
{ Libera (solta) ALT }
keybd_event(VK_MENU, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;

//Procedimento para ALT+TAB Win2k e WinXp
procedure TFrmContador.travaALT;
begin
   id1 := GlobalAddAtom('Hotkey1');
   RegisterHotKey(Handle, id1, MOD_ALT, VK_TAB);
end;

procedure TFrmContador.liberaALT;
begin
   UnRegisterHotKey(Handle, id1);
end;
//-------MINIMIZAR TODOS OS PROGRAMAS ABERTOS....
procedure TFrmContador.MinimizeAll;
var HW:HWnd;
begin
  HW:=handle;
  while HW > 0 do
  begin
    if IsWindowVisible(HW) then
    Postmessage(HW,WM_SYSCOMMAND,SC_MINIMIZE,0);
    HW:=GetnextWindow(HW,GW_HWNDNEXT);
  end;
end;

//----Pega o Ip da maquina
function TFrmContador.GetLocalIP : string;
type
  TaPInAddr = array [0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe : PHostEnt;
  pptr : PaPInAddr;
  Buffer : array [0..63] of char;
  I : Integer;
  GInitData : TWSADATA;
begin
  WSAStartup($101, GInitData);
  Result := '';
  GetHostName(Buffer, SizeOf(Buffer));
  phe :=GetHostByName(buffer);
  if phe = nil then Exit;
  pptr := PaPInAddr(Phe^.h_addr_list);
  I := 0;
  while pptr^[I] <> nil do begin
  result:=StrPas(inet_ntoa(pptr^[I]^));
  result := StrPas(inet_ntoa(pptr^[I]^));
  Inc(I);
  end;
  WSACleanup;
end;

//-------Desligar Win2k e XP
{function TFrmContador.WinExit(flags: integer): boolean;
  function SetPrivilege(privilegeName: string; enable: boolean): boolean;
  var
    tpPrev, tp : TTokenPrivileges;
    token : THandle;
    dwRetLen : DWord;
  begin
    result := False;
    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
    tp.PrivilegeCount := 1;
    if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
    begin
      if enable then
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
      tp.Privileges[0].Attributes := 0;
      dwRetLen := 0;
      result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
    end;
    CloseHandle(token);
  end;
begin
  if SetPrivilege('SeShutdownPrivilege', true) then
  begin
    ExitWindowsEx(flags, 0);
    SetPrivilege('SeShutdownPrivilege', False)
  end;
end; }

//novo procedimento para desligar Win2k e WinXp
procedure TFrmContador.ShutDown;
var
   TokenPriv: TTokenPrivileges;
   H: DWORD;
   HToken: THandle;
begin
//   Flag := EWX_POWEROFF;
   (* WIN 2000 e NT *)
   if Win32Platform = VER_PLATFORM_WIN32_NT then
   begin
     OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, HToken);
     LookUpPrivilegeValue(nil, 'SeShutdownPrivilege',
       TokenPriv.Privileges[0].Luid);
     TokenPriv.PrivilegeCount := 1;
     TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     H := 0;
     AdjustTokenPrivileges(HToken, False, TokenPriv, 0,
PTokenPrivileges(nil)^, H);
     CloseHandle(HToken);
   end;
   ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
end;

//Habilita ou desabilita a barra de tarefas
procedure TFrmContador.EnableTaskBar(bShow: Boolean);
begin
if bShow = True then
 EnableWindow(FindWindow
   ('Shell_TrayWnd',nil), TRUE)
else
 EnableWindow(FindWindow
   ('Shell_TrayWnd',nil), FALSE);
end;

//deixar a barra visível ou invisível
procedure TFrmContador.ShowTaskBar(bShow: Boolean);
begin
if bShow = True then
 ShowWindow(FindWindow
  ('Shell_TrayWnd',nil), SW_SHOWNA)
else
 ShowWindow(FindWindow
  ('Shell_TrayWnd',nil), SW_HIDE);
end;
//esconde o iniciar
procedure TFrmContador.EscondeIniciar(Visible:Boolean);
Var
   taskbarhandle, buttonhandle : HWND;
begin
   taskbarhandle := FindWindow('Shell_TrayWnd', nil);
   buttonhandle := GetWindow(taskbarhandle, GW_CHILD);
   If Visible=True Then
   Begin
      ShowWindow(buttonhandle, SW_RESTORE); {mostra o botão}
   End
   Else
   Begin
      ShowWindow(buttonhandle, SW_HIDE); {esconde o botão}
   End;
end;
//desabilita as opções do menu iniciar
procedure TFrmContador.OpcoesMenu(Visible:Boolean);
Var
taskbarhandle, buttonhandle : HWND;
begin
   taskbarhandle := FindWindow('BaseBar', nil);
   buttonhandle := GetWindow(taskbarhandle, GW_CHILD);
   If Visible=True Then
   Begin
      ShowWindow(buttonhandle, SW_RESTORE); {mostra o botão}
   End
   Else
   Begin
      ShowWindow(buttonhandle, SW_SHOWMINNOACTIVE); {esconde o botão}
   End;
end;

// adiciona um parametro ao comando
procedure AdicionarParametro (parametro: string; index: integer);
begin
  if index= 0 then
    Comando:='';
  while length(Comando)< index*10 do
    Comando:= Comando+ ' ';
  insert (parametro, comando, (index*10)+1);
end;

// envia o comando atual para o servidor
Procedure TFrmContador.enviarComando;
begin
  If MsgClient101.Connected then begin
    ShowMessage ('Aguarde, ocupado!');
    Exit;
  end;
  label3.caption:= 'Espere, enviando...';
  label3.caption:= 'Resposta: '+ MsgClient101.Postit (comando);
end;

//=========================

Function TFrmContador.GetStateK (Key: integer): boolean;
begin
Result := Odd (GetKeyState (Key));
end;

function RegisterServiceProcess(dwProcessID,dwType:DWORD):DWORD; STDCALL;External 'Kernel32.DLL';

procedure EnviarMensagem (s: string);
begin
  Application.Title:= 'Warning';
  MessageDlg (S, mtWarning, [mbOk], 0);
  Application.Title:= 'Client';
end;

procedure Calcular (r : string);
begin
   j := StrToFloat(r);
end;

procedure Tempo (t : string);
begin
   k := StrToTime(t);
   FrmContador.Label5.caption := TimeToStr(k);
end;

procedure vai;
var
   x : string;
   arq: TextFile;
   linha: String;
begin
  AssignFile ( arq, 'C:\LAN Client\ip.txt' );
  Reset ( arq );
  ReadLn ( arq, linha );
  ReadLn ( arq, linha );
  FrmContador.MsgClient101.Host := linha;
  CloseFile ( arq );
//------------------
  x := FrmContador.label1.caption;
  AdicionarParametro (ctime, 0);
  AdicionarParametro (x, 1);
  FrmContador.EnviarComando;
end;

procedure vai2;
var
   x : string;
   arq: TextFile;
   linha: String;
begin
  AssignFile ( arq, 'C:\LAN Client\ip.txt' );
  Reset ( arq );
  ReadLn ( arq, linha );
  ReadLn ( arq, linha );
  FrmContador.MsgClient101.Host := linha;
  CloseFile ( arq );
//------------------
  x := FrmContador.GetLocalIP;
  AdicionarParametro (cip, 0);
  AdicionarParametro (x, 1);
  FrmContador.EnviarComando;
end;

procedure LigaMonitor (ligar: boolean);
begin
  if ligar then
    SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)
  else
    SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
end;

procedure Protege;
begin
   SetForegroundWindow(Application.Handle);
   FrmContador.ALTAB;
   Sleep(3000);
   FrmContador.MinimizeAll;
   sleep(1000);
   Frmprotec.Show;
   FrmContador.travatask(true);
   FrmContador.travaALT;
   Frmcontador.Timer1.Enabled := False;
   i := StrToTime('00:00:00');
   k := StrToTime('00:00:00');
   FrmContador.label5.caption := TimeToStr(k);
   Frmcontador.label1.caption := '00:00:00';
   Frmcontador.label2.caption := 'R$ 0,00';
   FrmContador.EscondeIniciar(false);
   Frmcontador.ShowTaskBar(false);
   Frmcontador.EnableTaskBar(false);
   Frmcontador.OpcoesMenu(false);
end;

procedure fechaprotege;
var
   OldValue : LongBool;
   H : HWnd;
begin
//   FrmContador.label5.caption := TimeToStr(k);
   fechar := true;
   SystemParametersInfo(97, Word(false), @OldValue, 0);
   frmprotec.close;
   Application.Restore;
   H := FindWindow(Nil,'Client'); {troque project1 pelo nome do seu projeto)}
   if H <> 0 then
     ShowWindow(H,SW_HIDE);
   FrmContador.travatask(false);
   FrmContador.liberaALT;
   Frmcontador.Timer1.Enabled := true;
   Frmcontador.escondeiniciar(true);
   Frmcontador.ShowTaskBar(true);
   Frmcontador.EnableTaskBar(true);
   Frmcontador.OpcoesMenu(true);
end;

procedure SairWindows;
begin
  FrmContador.ShutDown;
//  ExitWindowsEx(EWX_SHUTDOWN, 0 );
end;

procedure TFrmcontador.Timer1Timer(Sender: TObject);
var
   dez, cinco, dois : string;
begin
   i := i + StrToTime('00:00:01');
   dez := TimeToStr(StrToTime('00:10:00')+i);
   cinco := TimeToStr(StrToTime('00:05:00')+i);
   dois := TimeToStr(StrToTime('00:02:00')+i);
   label1.Caption := TimeToStr(i);
   if label5.caption = dez then
   begin
      LMDWaveComp1.Play;
      LMDWaveComp1.Play
   end;
   if label5.caption = cinco then
   begin
      LMDWaveComp2.Play;
      LMDWaveComp2.Play
   end;
   if label5.caption = dois then
   begin
      LMDWaveComp3.Play;
      LMDWaveComp3.Play
   end;
   label4.caption := FormatDateTime('hh:mm',i);
   label2.caption := 'R$ '+(FormatFloat('#,##0.00',((StrToInt(Copy(TimeToStr(i),1,2))*60) + StrToInt(Copy(TimeToStr(i),4,2)))*j));

end;

procedure TFrmcontador.FormCreate(Sender: TObject);
var
 pWDir: array [0..255] of char;
begin
  //pegar informações
  GetWindowsDirectory (pWDir, 255);
  WindowsDir := StrPas (pWDir);

  // num funciona (pq?)
  if HPrevInst <>0 then begin
    Halt;
  end;

end;

procedure TFrmcontador.MsgServerMSG(Sender: TComponent; const sFrom,
  sMsg: String);
var
  comando: string;

  // retira os parametros do comando enviado
  function Parametro (index: integer): String;
  begin
    if index >= 0 then
      Parametro:= trim(copy (SMsg, 10*index+1, 10))
    else
      Parametro:= trim(copy (SMsg, 10*abs(index)+1, 200));
  end;


begin
  comando:= trim(parametro (0));

  // a lista de constantes com os comandos
  //estão no diretorio /share para ser compartilhada pelo
  // client e o server, evitando diferenças

  if Comando = cLIgarMonitor then
    LigaMonitor (True);

  if Comando = cApagarMonitor then
    LIgaMonitor (False);

  if Comando = cMensagem then
    EnviarMensagem (parametro (-1));

  if Comando = cCalcular then
    Calcular (parametro (-1));

  if Comando = cTempo then
     Tempo (parametro (-1));

  if Comando = cSairWindows then
    SairWindows;

  if Comando = cProtege then
     Protege;

  if Comando = cfechaprotege then
     fechaprotege;
  if Comando = cvai then
     vai;
  if Comando = cvai2 then
     vai2;
end;

procedure TFrmcontador.FormShow(Sender: TObject);
var
   H : HWnd;
begin
   SetForegroundWindow(Application.Handle);
   Frmprotec.Show;
   Frmprotec.WindowState := wsMinimized;
   Frmprotec.WindowState := wsMaximized;
   H := FindWindow(Nil,'Client'); {troque project1 pelo nome do seu projeto)}
   if H <> 0 then
     ShowWindow(H,SW_HIDE);
   travaALT;
   travatask(true);
   EscondeIniciar(false);
   ShowTaskBar(false);
   EnableTaskBar(false);
   OpcoesMenu(false);
end;

procedure TFrmcontador.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  If Not fecha Then
     Action := caNone
  else
     Action := CaFree;
end;

procedure TFrmcontador.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
If GetStateK (VK_LMENU) And (Key = VK_F4) Then
  fecha := False;
end;

procedure TFrmcontador.SpeedButton2Click(Sender: TObject);
begin
   Frmmsg.show;
end;

procedure TFrmcontador.MsgClient101ConnectionFailed(Sender: TObject);
begin
   ShowMessage('Não foi possível conectar a estação Remota, verifique os seguintes:'+#13+#13+'**Número de IP incorreto...'+#13+'**Estação poder estar desligada ou'+#13+'**Programa de acesso ao cliente desabilitado');
end;

procedure TFrmcontador.SpeedButton1Click(Sender: TObject);
begin
   FRmSenha.Show;
end;

end.
